home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / m68k / tutor.arc / W.SA < prev    next >
Text File  |  1990-01-05  |  14KB  |  407 lines

  1. W        IDNT      2,0       Software Abort, Hex print routines      06/05/82
  2.  
  3.          XDEF      ABORT335
  4.          XDEF      ABORTB
  5.          XDEF      ABORTE
  6.          XDEF      CKADDR
  7.          XDEF      CKWADR
  8.          XDEF      EVECT2
  9.          XDEF      EVECT4
  10.          XDEF      EVECTL
  11.          XDEF      FNEXTF
  12.          XDEF      FRELADDR
  13.          XDEF      GETDECNU
  14.          XDEF      GETEXP
  15.          XDEF      GETHEX
  16.          XDEF      GETHEXNU
  17.          XDEF      GETNUMA
  18.          XDEF      GETNUMD
  19.          XDEF      PNTZHX
  20.          XDEF      PNT8HX
  21.          XDEF      PNT6HX
  22.          XDEF      PNT4HX
  23.          XDEF      PNT2HX
  24.          XDEF      PUTHEX
  25.  SPC 1
  26.          XREF.S    AV12
  27.          XREF.S    AV31
  28.          XREF      ERROR
  29.          XREF      FAULTSER
  30.          XREF      FIXBUF
  31.          XREF      FIXDADD
  32.          XREF      FIXDATA
  33.          XREF      FIXDCRLF
  34.          XREF      INITSER
  35.          XREF      MACSBUG
  36.          XREF      MSG
  37.          XREF.S    OFFSET
  38.          XREF      OUT1CR
  39.          XREF      OUTPUT
  40.          XREF.S    REGA7
  41.          XREF      SAVE
  42.          XREF.S    TEMP
  43.          XREF      TDISPLY
  44.  SPC 3
  45. CR       EQU       $D
  46. LF       EQU       $A
  47. EOT      EQU       4
  48.  SPC 1
  49. ADDR2MEM MACRO
  50.          PEA       \1(PC)              MOVE ADDRESS TO MEMORY; POSITION
  51.          MOVE.L    (A7)+,\2               INDEPENDANT = TO "MOVE.L #\1,\2"
  52.          ENDM
  53.  SPC 1
  54. SAVEREGS MACRO
  55.          MOVE.L    A7,REGA7            SAVE STACK POINTER
  56.          LEA       SV\@(PC),A7    A7   = RETURN ADDRESS (FOR CALL TO SAVE)
  57.          MOVE.L    A7,TEMP             TEMP = RETURN ADDRESS
  58.          BRA       SAVE                BSR WITHOUT USING STACK
  59. SV\@     DS        0
  60.  SPC 1
  61.          ENDM
  62.  SPC 1
  63.          SECTION   10
  64.          ADDR2MEM  ABORTB,AV31         ABORT
  65.  
  66.  
  67.          SECTION   11
  68.  SPC 1
  69. *
  70. *   HANDLE THE ABORT BUTTON
  71. *
  72. ABORTB   MOVE.W    #$2700,SR
  73.          SAVEREGS
  74.          BSR       FAULTSER            RESET SERIAL PORTS
  75.          LEA       MSG012(PC),A5       'SOFTWARE ABORT'
  76.  SPC 1
  77.          BSR       INITSER   RESET SERIAL PORTS (CLEAR TM MODE)
  78.          BSR     FIXDCRLF    MOVE MESSAGE TO BUFFER
  79. EVECT4   BSR     OUTPUT    MSG TO PORT1                              2,0
  80. ABORT335 BSR     TDISPLY            DISPLAY REGISTERS
  81.          BRA     MACSBUG
  82.  SPC 1
  83. MSG012   DC.B      LF,LF,'SOFTWARE ABORT',CR,LF,EOT
  84.  PAGE
  85. ABORTE MOVE.L      #'????',$30         UNKNOWN INTERRUPT
  86.  SPC 1
  87. *    SAVE REGISTERS AND PRINT VECTOR MSG
  88. *
  89. EVECTL   SAVEREGS
  90.          BSR       FAULTSER            RESET SERIAL PORTS
  91. EVECT2   BSR FIXBUF  PRINT MESSAGE "XXXX TRAP ERROR"
  92.        MOVE.W #$0D0A,(A6)+
  93.        MOVE.L AV12,(A6)+     TYPE OF ERROR
  94.          LEA       MSG010(PC),A5     'TRAP ERROR'
  95.          BSR    FIXDADD
  96.          BRA    EVECT4                 .                             2,0
  97.  SPC 1
  98. MSG010   DC.B      ' TRAP ERROR',CR,LF,EOT
  99.          PAGE
  100. *
  101. *  PRINT HEX ROUTINES
  102. *
  103. *
  104. * PRINT 8 HEX CHARACTERS
  105. *
  106. *  D0,D1,D2 DESTROYED
  107. *
  108. PNT8HX   SWAP D0  FLIP REG HALVES
  109.          BSR.S  PNT4HX  DO TOP WORD
  110.          SWAP D0  NOW DO LOWER WORD
  111.          BRA.S PNT4HX
  112. * PRINT 6 HEX CHARACTERS
  113. PNT6HX   SWAP D0  FLIP REGISTER HALVES
  114.          BSR.S PNT2HX
  115.          SWAP D0  FLIP BACK REG HALVES
  116. * PRINT 4 HEX CHARACTERS IN D0.W
  117. PNT4HX   MOVE.W D0,D1  SAVE IN TEMP
  118.          ROR.W  #8,D0  GET BITS 15-8 INTO LOWER BYTE
  119.          BSR.S  PNT2HX  PRINT IT
  120.          MOVE.W D1,D0  PULL IT BACK
  121. * PRINT 2 HEX CHARACTERS IN D0.B
  122. PNT2HX   MOVE.W D0,D2  SAVE IN TEMP REG
  123.          ROXR.W #4,D0  FORM UPPER NIBBLE
  124.          BSR.S PUTHEX  PUT ASCII INTO PRINT BUFFER
  125.          MOVE.W D2,D0  GET BACK FROM TEMP
  126. * CONVERT D0.NIBBLE TO HEX & PUT IT IN PRINT BUFFER
  127. *
  128. PUTHEX   AND.B #$0F,D0  SAVE LOWER NIBBLE
  129.          OR.B #$30,D0  CONVERT TO ASCII
  130.          CMP.B #$39,D0   SEE IF IT IS>9
  131.          BLE.S SAVHEX
  132.          ADD #7,D0  ADD TO MAKE 10=>A
  133. SAVHEX   MOVE.B D0,(A6)+ PUT IT IN PRINT BUFFER
  134.          RTS
  135.            PAGE
  136. * FORMAT RELATIVE ADDRESS  AAAAAA+Rn
  137. *        ENTER     D0 = VALUE
  138. *                  A6 = STORE POINTER
  139. *
  140. FRELADDR MOVEM.L   D1/D5-D7/A0,-(A7)
  141.          LEA       OFFSET,A0
  142.          MOVE.L    #-1,D7              D7 = DIFF. BEST FIT
  143.          CLR.L     D6                  D6 = OFFSET POSITION
  144.  
  145. FREL10   MOVE.L    D0,D1
  146.          TST.L     (A0)
  147.          BEQ.S     FREL15              ZERO OFFSET
  148.          SUB.L     (A0),D1             D1 = DIFF.
  149.          BMI.S     FREL15              NO FIT
  150.  
  151.          CMP.L     D7,D1
  152.          BCC.S     FREL15              OLD FIT BETTER
  153.  
  154.          MOVE.L    D1,D7               D7 = NEW BEST FIT
  155.          MOVE.L    D6,D5               D5 = POSITION
  156.  
  157. FREL15   ADD.L     #4,A0
  158.          ADD.L     #1,D6
  159.          CMP.W     #8,D6               .                             2,0
  160.          BNE       FREL10              MORE OFFSETS TO CHECK
  161.  
  162.          TST.L     D7
  163.          BMI.S     FREL25              NO FIT
  164.          TST       D6
  165.          BNE.S     FREL20
  166.          TST.L     OFFSET
  167.          BEQ.S     FREL25              R0 = 000000; NO FIT
  168.  
  169. FREL20   MOVE.L    D7,D0
  170.          BSR       PNT6HX              FORMAT OFFSET
  171.          MOVE.B    #'+',(A6)+          +
  172.          MOVE.B    #'R',(A6)+          R
  173.          ADD.B     #'0',D5             MAKE ASCII
  174.          BRA.S     FREL30
  175.  
  176. FREL25   BSR       PNT6HX              FORMAT ADDRESS AS IS
  177.          MOVE.B    #' ',D5             .                             2,0
  178.          MOVE.B    D5,(A6)+            THREE SPACES FOR ALIGNMENT    2,0
  179.          MOVE.B    D5,(A6)+            .                             2,0
  180. FREL30   MOVE.B    D5,(A6)+            .                             2,0
  181.  
  182.          MOVEM.L   (A7)+,D1/D5-D7/A0   .                             2,0
  183.          RTS
  184.          PAGE
  185. *
  186. *
  187. *   PRINT HEX (ZERO SURPRESS)
  188. *
  189. PNTZHX   CLR.L D4  IS ZERO WHEN SURPRESSING
  190.          MOVE.L D0,D1  SAVE IN TEMP
  191.          BEQ.S PNTZ81  IF ZERO
  192.          BPL.S PNTZ0
  193.          NEG.L D1  CHANGE TO POSITIVE VALUE
  194.          BMI.S  PNTZ81 WATCH OUT SPECIAL CASE $80000000
  195.          MOVE.B #'-',(A6)+  PUT SIGN INTO BUFFER
  196. PNTZ0    MOVE.L #8,D2   8 POSSIBLE CHARACTERS
  197. PNTZ1    MOVE.L D1,D0  UNSAVE IT
  198.          MOVE.L D2,D3 COUNT DOWN FROM HERE
  199.          SUB.L #1,D3  BACK OFF ONE
  200.          BEQ.S PNTZ4  IF NO ROTATE SKIP THIS
  201. PNTZ2    ASR.L #4,D0  ROTATE LRIGHT
  202.          AND.L #$FFFFFFF,D0  CLEAR TOP NIBBLE
  203.          SUB.L #1,D3
  204.          BNE PNTZ2
  205. PNTZ4    AND.B #$F,D0  SAVE ONLY NIBBLE
  206.          BNE.S PNTZ3
  207.          TST.B D4  SEE IF STILL SURPRESSING
  208.          BEQ.S PNTZ8
  209. PNTZ3    BSR PUTHEX  PUT A HEX CHAR IN BUFFER
  210.          MOVE.B D0,D4  MARK AS NON-SURPRESSING MODE
  211. PNTZ8    SUB.L #1,D2    DO ANOTHER CHAR
  212.          BNE PNTZ1
  213.          TST.B D4  SEE IF ANYTHING PRINTED
  214.          BNE.S PNTZ9
  215. PNTZ81   MOVE.B #'0',(A6)+  MOVE AT LEAST ONE ZERO
  216. PNTZ9    RTS
  217.          PAGE
  218. * FIND NEXT FIELD... (A5) POINTS TO FIELD, (A0) NULL FIELD RETURN
  219. *   *-*-WARNING-*-* IF (A0) RETURN IS USED;  RETURN MUST BE AT
  220. *                   SAME SUBROUTINE LEVEL OR STACK GETS SCREWED UP
  221. *
  222. *  SKIP LEADING SPACES
  223. *  TERMINATE NULL FIELD ON COMA ,SEMICOLEN OR A5=A6
  224. FNEXTF1  ADD.L     #1,A5
  225.  SPC 1
  226. FNEXTF   MOVE.B    (A5),D0   ENTRY POINT
  227.          CMP.L     A6,A5
  228.          BCC.S     FNEXTF7   AT END OF BUFFER
  229.          CMP.B     #' ',D0
  230.          BEQ       FNEXTF1   SPACE
  231.  SPC 1
  232.          CMP.B     #',',D0
  233.          BEQ.S     FNEXTF7   COMA- NULL FIELD
  234.          CMP.B     #';',D0
  235.          BEQ.S     FNEXTF7   SEMICOLEN - NULL FIELD
  236.          RTS                 NORMAL FOUND FIELD RETURN
  237.  SPC 1
  238. FNEXTF7  ADD.L     #4,A7     TRIM STACK
  239.          JMP       (A0)      NULL FIELD RETURN
  240.          PAGE
  241. **************************************************************
  242. * THIS ROUTINE MAKES SURE YOU ARE ON THE CORRECT BOUNDRY.    *
  243. *  D0 = ARGUMENT...   CHECKS ADDRESS AND WORD ALIGNMENTS.   *
  244. **************************************************************
  245.  SPC 2
  246. CKWADR   ROR.L     #1,D0
  247.          ROL.L     #1,D0
  248.          BCS.S     CKADR39   NOT WORD ALIGNED
  249.  SPC 1
  250. CKADDR   CMP.L   #$1000000,D0 VALID ADDRESS?
  251.          BCS.S   CKADR99     GOOD ADDRESS
  252.  SPC 1
  253. CKADR39  LEA     MSG018(PC),A5
  254.          BSR     FIXDATA
  255.          BSR       PNT8HX
  256.          BSR     OUT1CR
  257.          BRA     MACSBUG
  258.  SPC 1
  259. CKADR99  RTS
  260.  SPC 1
  261. MSG018   DC.B      'INVALID ADDRESS=',EOT
  262.  PAGE
  263. * EVALUATE EXPRESSION
  264. *  NUMBER PLUS OR MINUS NUMBER....
  265. *
  266. GETEXP   MOVE.L    D7,-(A7)            SAVE D7
  267.          CLR.L     D7
  268. GETEXP21 BSR.S     GETNUMA             GET NUMBER
  269.          ADD.L     D0,D7               D7 = NUMBER BEING BUILT
  270. GETEXP15 MOVE.B    (A5)+,D1            D1 = TERMINATING CHAR
  271.          CLR.L     D0                  D0 = NEXT NUMBER (=0 1ST TIME)
  272.          CMP.B     #'+',D1
  273.          BEQ       GETEXP21            PLUS
  274.          CMP.B     #'-',D1
  275.          BNE.S     GETEXP39            NOT MINUS
  276.          BSR.S     GETNUMA             GET NEXT NUMBER
  277.          SUB.L     D0,D7
  278.          BRA       GETEXP15
  279.  SPC 1
  280. GETEXP39 MOVE.L    D7,D0               D0 = VALUE BUILT
  281.          SUB.L     #1,A5               A5 = CHAR AFTER EXPRESSION
  282.          MOVE.L    (A7)+,D7            RESTORE D7
  283.          RTS
  284.  PAGE
  285. *   ROUTINES TO CONVERT STRING TO BINARY VALUE
  286. *
  287. *        ACCEPTS PREFIXES:
  288. *         % binary
  289. *         @ octal
  290. *         & decimal
  291. *         $ hex
  292. *
  293. GETNUMD  BSR.S     GETDECNU            GET DECIMAL NUMBER
  294. GETNUMD9 BNE       ERROR
  295.          RTS
  296.  
  297. GETNUMA  BSR.S     GETHEXNU            GET HEX NUMBER
  298.          BRA       GETNUMD9
  299.  
  300. GETDECNU MOVEM.L   D1-D5/A0,-(A7)      DECODE AS A DECIMAL NUMBER
  301.          MOVE.L    #10,D3              D3 = BASE (DECIMAL)
  302.          BRA.S     GETN20
  303.  SPC 2
  304. GETHEXNU MOVEM.L   D1-D5/A0,-(A7)      DECODE AS A HEX NUMBER
  305.          MOVE.L    #16,D3    D3 = BASE
  306.  SPC 1
  307. GETN20   CLR.W     D4        D4 = FLAG FOR CHARACTER HIT
  308.          CLR.L     D1        D1 = TEMP RESULTS
  309.          CMP.B     #' ',(A5)
  310.          BEQ.S     GETN80              FIRST CHAR SPACE; ERROR
  311.  
  312. GETN30   CMP.L A6,A5   SEE IF AT END OF BUFFER
  313.          BEQ.S     GETN90
  314.          CLR.L     D0
  315.          MOVE.B    (A5)+,D0            D0 = CHARACTER
  316.  SPC 1
  317.          LEA       GETNDATA(PC),A0     POINTER TO TERMINATE CHARS
  318. GETN40   MOVE.B    (A0)+,D5            D5 = TERMINATION CHAR
  319.          BEQ.S     GETN50              NOT TERM.CHAR
  320.          CMP.B     D5,D0
  321.          BEQ.S     GETN85              FOUND TERMINATION CHAR; EXIT
  322.          BRA       GETN40
  323.  SPC 1
  324. GETN50   CMP.B     #'%',D0             SEE IF FLAGGED AS BINARY
  325.          BNE.S     GETN60
  326.          MOVE.L    #2,D3               BASE IS BINARY
  327. GETN55   TST.W     D4                  ANYTHING ENTERED
  328.          BNE.S     GETN80              CONFLICT
  329.  
  330. GETN57   MOVE.L    #-1,D4              SET DATA ENTERED FLAG
  331.          BRA       GETN30
  332.  
  333. GETN60   CMP.B     #'@',D0             SEE IF FLAGGED AS OCTAL
  334.          BNE.S     GETN65
  335.          MOVE.L    #8,D3               BASE IS OCTAL
  336.          BRA       GETN55
  337.  
  338. GETN65   CMP.B     #'&',D0             SEE IF FLAGGED AS DECIMAL
  339.          BNE.S     GETN70
  340.          MOVE.L    #10,D3              BASE IS DECIMAL
  341.          BRA       GETN55
  342.  SPC 1
  343. GETN70   CMP.B     #'$',D0             SEE IF FLAGGED AS HEX
  344.          BNE.S     GETN75
  345.          MOVE.L    #16,D3              BASE IS 16
  346.          BRA       GETN55
  347.  SPC 1
  348. GETN75   SUB.B     #$30,D0
  349.          BLT.S     GETN80              LESS THAN ZERO
  350.          CMP.B     #9,D0
  351.          BLE.S     GETN77              VALUE 0 - 9
  352.          CMP.B     #$11,D0
  353.          BLT.S     GETN80              LESS THAN A
  354.          CMP.B     #$16,D0
  355.          BGT.S     GETN80              GREATER THAN F
  356.          SUB.B     #7,D0               MAKE BINARY
  357.  
  358. GETN77   CMP.W     D3,D0               IS INPUT LARGER THAN BASE
  359.          BCC.S     GETN80              LARGER THAN BASE
  360.          MOVE.L    D1,D2               GET READY TO MULTIPLY D1*BASE
  361.          SWAP      D1
  362.          MULU      D3,D1   TOP PART
  363.          SWAP      D1
  364.          TST.W     D1   CHECK FOR OVERFLOW
  365.          BNE.S     GETN80              VALUE IS TOO LARGE
  366.          MULU      D3,D2  NOW WORK ON LOW WORD
  367.          ADD.L     D2,D1  PUT IT BACK TOGETHER
  368.          BVS.S     GETN80  OVERFLOW?
  369.          ADD.L     D0,D1  ADD IN NEW STUFF
  370.          BVC       GETN57
  371. GETN80   MOVE.L    #-1,D0              ERROR RETURN (BNE)
  372.          BRA.S     GETN95
  373.  
  374. GETN85   SUB.L     #1,A5     BACK UP TO POINT AT SPACE/PREVIOUS CHAR
  375. GETN90   MOVE.L    D1,D0     SET UP RESULT FOR RETURN
  376.          CLR.L     D1                  NORMAL RETURN (BEQ)
  377. GETN95   MOVEM.L   (A7)+,D1-D5/A0      RESTORE SOME REGISTERS
  378.          RTS
  379.  
  380. GETNDATA DC.B      ' (+,-.:;=^]',0      TERMINATE CHARS
  381.          PAGE
  382. *
  383. *  ***GETHEX***  GET HEX (BINARY VALUE FROM ASCII)
  384. *   D0.B HAS ASCII CHAR  RETURNS $0-$F BINARY
  385. *
  386. GETHEX CMP.B #$30,D0  IS IT LESS THAN ZERO
  387.        BLT.S PNMSG011
  388.        CMP.B #$39,D0  IS IT GREATER THAN 9
  389.          BLE.S     GTHX2     GOOD HEX
  390.  SPC 1
  391.        CMP.B #$41,D0  IS IT LESS THAN 'A'
  392.        BLT.S       PNMSG011
  393.        CMP.B #$46,D0  IS IT GT 'F'
  394.        BGT.S       PNMSG011
  395.        SUB.B #7,D0  MAKE IT SMALLER A=10
  396. GTHX2    AND.L     #$F,D0
  397.          RTS
  398.  SPC 1
  399. PNMSG011 BSR       FIXBUF  PRINT NOT A HEX DIGIT
  400.          MOVE.B    D0,(A6)+  PUT IN OFFENDING CHAR
  401.          LEA       MSG011(PC),A5          '  IS NOT A HEX DIGIT'
  402.          BSR       FIXDADD
  403.          BRA MSG  GO PRINT IT AND ENTER MACSBUG
  404.  SPC 1
  405. MSG011   DC.B      '  IS NOT A HEX DIGIT',EOT
  406.  SPC 3
  407.          END